package com.kfm.base.em;

import java.util.Arrays;

/**
 * 枚举,不能被实例化。每一个实例都声明在在枚举中(定义在枚举的第一部分)。多个实例间用 ,(逗号隔开)。; (分号)表示实例声明完毕。
 * 枚举不能直接通过 new 来创建枚举的实例。
 * <p>
 * 枚举有构造方法，只能使用 private 修饰的。
 * 枚举可以有成员， 成员字段，成员方法，成员类。
 * 枚举不能被继承
 * <p>
 * 不能使用 abstract、final修饰枚举类，枚举类是隐式 final 类
 * <p>
 * switch 表达式可以使用 枚举。
 *
 * 所有使用 enum 声明的都是枚举类，枚举类都是 java.lang.Enum 类的子类。
 * 枚举不能被克隆(clone)
 * 枚举对象可以调用从 java.lang.Enum 类继承的方法：
 *   ordinal()  枚举实例声明的索引值
 *   static values()  枚举类所有实例的数组
 *
 *  枚举是天然的单例模式，只有一个枚举常量则这个枚举类只有一个实例
 */
public enum Week implements Cloneable {

    /*
       每一个枚举实例(枚举常量)都是枚举类型的
       Monday 的类型就是其声明所在的枚举类类型 Week

    */
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;

    private Week() {
    }


    public static final String NAME = "A";

    public void test() {
        System.out.println("test");
    }

}

enum Single {
    SINGLE;
}

class Main {

    public static void main(String[] args) {
        Week mon = Week.MONDAY;

//        Week week = new Week();

//        mon.test();
//        System.out.println(Week.NAME);

        System.out.println(mon.name());
        System.out.println(mon.ordinal());

        // week
        Week week = Enum.valueOf(Week.class, "MONDAY");
        System.out.println(week);

        // 所有 Week 的 实例放到数组中
        Week[] values = Week.values();
        System.out.println(Arrays.toString(values));
    }
}
